#include <time.h>
#include <mqueue.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/*
消费者线程：不断读取消息队列的消息，并输出到控制台
*/
int main()
{
    char *mq_name = "/p_c_mq";

    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 100;

    // 创建或打开消息队列
    mqd_t mqdes = mq_open(mq_name, O_CREAT | O_RDONLY, 0666, &attr);
    if (mqdes == -1)
    {
        perror("打开消息队列失败");
        return 1;
    }

    char write_buf[100];
    struct timespec time_spec;

    while (1)
    {
        // 清空写缓冲区
        memset(write_buf, 0, 100);

        // 获取1天后的time_spec结构对象，目的是在测试期间使得消费者一直等待生产者发送的数据
        clock_gettime(CLOCK_REALTIME, &time_spec);
        time_spec.tv_sec += 60 * 60 * 24;

        // 读取出队列的最前面的一条消息
        mq_timedreceive(mqdes, write_buf, 100, NULL, &time_spec);

        // 如果收到生产者发送的EOF消息，则结束进程
        if (write_buf[0] == EOF)
        {
            printf("接收到生产者的终止信号，准备退出...\n");
            break;
        }

        // 如果没有收到EOF，将接收到的数据打印到标准输出
        printf("接收到来自于生产者的数据\n%s", write_buf);
    }

    // 释放消息队列描述符
    close(mqdes);

    // mq_unlink 只应调用一次，我们选择在生产者中完成此操作

    return 0;
}